﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

using MLopez.BizVal.CW.Base;

namespace MLopez.BizVal.CW.DosTuplas
{
    /// <summary>
    /// Esta clase encapsula el modelo de 2-tuplas para representación de información lingüística
    /// </summary>
    public class DosTupla:IComparable<DosTupla>
    {
        /// <summary>
        /// Etiqueta actual de la 2-tupla
        /// </summary>
        public TriEtiqueta Etiqueta { get; set; }

        /// <summary>
        /// Indice de la etiqueta dentro del conjunto de etiquetas
        /// </summary>
        public int Indice { get; set; }
        /// <summary>
        /// Nivel de la jerarquía lingüísitica en el que se representa la información
        /// </summary>
        public int Nivel { get; set; }

        /// <summary>
        /// Traslación simbolica 
        /// </summary>
        public decimal Alpha { get; set; }

        /// <summary>
        /// Crea una nueva 2-tupla sin información
        /// </summary>
        public DosTupla()
        {
            Alpha = 0;  
        }

        /// <summary>
        /// Crea una 2-tupla con información de una etiqueta y su traslación.
        /// </summary>
        /// <param name="etiqueta">Etiqueta.</param>
        /// <param name="alpha">Traslación</param>
        public DosTupla(TriEtiqueta etiqueta, decimal alpha)
        {
            Etiqueta = etiqueta;
            Alpha = alpha;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override bool Equals(object obj)
        {
            try
            {
                DosTupla otra = (DosTupla)obj;
                return ((this.Etiqueta.Equals(otra.Etiqueta)) && (otra.Alpha == this.Alpha) && (this.Nivel == otra.Nivel));                
            }
            catch
            {
                return false;
            }
            
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override int GetHashCode()
        {
            string format = "(i={0},l={1},{2})";
            string hashString = String.Format(format, this.Indice, this.Nivel, this.Alpha.ToString());
            return hashString.GetHashCode();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            string format = "({0}(i={1},l={2}), {3:F4})";
            return String.Format(format, Etiqueta.Termino, this.Indice, this.Nivel, this.Alpha);
        }



        #region IComparable<DosTupla> Members
        /// <summary>
        /// 
        /// </summary>
        /// <param name="other"></param>
        /// <returns></returns>
        public int CompareTo(DosTupla other)
        {
            int rtn = 0;
            if (this.Nivel != other.Nivel)
                throw new CWException(CWExceptionType.IndexOutOfRange);

            rtn = this.Indice.CompareTo(other.Indice);
            if (rtn == 0)
                rtn = this.Alpha.CompareTo(other.Alpha);

            return rtn;
        }

        #endregion
    }       

}